package com.tedu.day02.oop;
/**
 * 抽象类：抽象类与抽象方法 关键字：abstract
 * 类：只能提供行为的概念，没有具体的实现行为
 * 抽象类与面向对象----多态有绝对的关系【向上造型创建抽象对象】
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，使用多态完成抽象类创建
 * 什么是使用抽象类？
 * 复杂项目时，需要在不同情况下实现不同的功能，首先抽象类【Android常用】
 * 定义抽象类与抽象方法？
 * 抽象类的定义：修饰符 abstract class 类名{}----毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 abstract 返回值 方法名（参数）；---没有具体的实现
 * 抽象类的“实例化：创建对象“：抽象类自身无法实例化
 * ①创建【N个】子类，继承抽象【父】类，子类一定实现抽象【父】类的所有方法
 * ②使用面向对象，多态【向上造型】 抽象类 引用=new 【实现】子类（）；
 * 注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫做”实现类“
 */
abstract class Animals{//抽象类
    //抽象方法:没有具体的实现【代码块】----一定继承--一定多态【造型】
    public abstract void say();
//①定义由final修饰的抽象方法？   ×
       /*  public final abstract void sleep(); */
//②定义抽象变量？               ×
          //abstract int i=1;
//③定义静态变量？               √
       static int i=1;
//④定义静态的抽象变量？          ×
     // static abstract int j=1;
//⑤定义静态的抽象方法【无实现】     ×
      // public static abstract void cat();
//⑥定义静态方法【无实现:空的代码块】  √
     public static  void cat(){};
     //⑤⑥总结：抽象方法|静态方法，方法定义：修饰符 static|abstract 返回值 方法名
//⑦可以定义内部类吗？静态内部类吗？  √
    static class Sos{}
//⑧抽象类有构造器吗？             √
    public Animals() {
    }
//⑨抽象类普通实现方法吗？         √
    public void run(){}
}
//⑩抽象类可以继承抽象吗？  实现两个抽象类来形容一个实现           √
     abstract class Thing extends Animals{
    public abstract void sleep();
}
    //继承之后的目的：两个抽象类中所有抽象方法---继承【子】抽象类
//实现类：实现抽象[父]类的方法---多个实现类---继承---抽象
     class Person1 extends Animals{//报错原因：完成重写
    public void say() {
        System.out.println("人---说话~");
    }
}
     public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法创建对象：提供抽象类方法---必须由子类实现--多态【造型】
        Animals a=new Person1();
        a.say();//向上造型--重写抽象父类的抽象方法【覆盖】
    }
}
